package com.xiaolun.completableFuture;

import java.util.concurrent.CompletableFuture;

/**
 * 1、做完子线程的任务后，调用子线程（异步调用）
 */
public class CompletableFutureDemo {

	public static void main(String[] args) throws Exception {

		//异步调用：没有返回值，只是启动一个线程去干活。
//        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
//            System.out.println(Thread.currentThread().getName()+"\t completableFuture1");
//        });
//        completableFuture1.get();

		//异步回调 supply:供给型函数
		CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {
			System.out.println(Thread.currentThread().getName() + "\t completableFuture2");
//			int i = 10 / 0;
			return 1024;
		});
		//whenComplete 有两个参数，没有返回值（类似消费者，获取线程中的函数）
		System.out.println(completableFuture2.whenComplete((t, u) -> {
			//正常完成，走该分支
			//-------t------1024
			System.out.println("-------t------" + t);
			//			-------u------null
			System.out.println("-------u------" + u); //异常信息
		}).exceptionally(f -> {
			//异常完成，走该分支
			System.out.println("-----exception---------" + f.getMessage());
			return 444;
			//返回正确结果：1024
			//返回异常结果：444
		}).get());
	}
}

